home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / emacs.lha / emacs-19.16 / lisp / asm-mode.el < prev    next >
Lisp/Scheme  |  1993-05-05  |  7KB  |  220 lines

  1. ;;; asm-mode.el --- mode for editing assembler code
  2.  
  3. ;; Copyright (C) 1991 Free Software Foundation, Inc.
  4.  
  5. ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
  6. ;; Last-Modified: 14 Jul 1992
  7. ;; Keywords: tools, languages
  8.  
  9. ;;     @(#)asm-mode.el    1.7
  10.  
  11. ;; This file is part of GNU Emacs.
  12.  
  13. ;; GNU Emacs is free software; you can redistribute it and/or modify
  14. ;; it under the terms of the GNU General Public License as published by
  15. ;; the Free Software Foundation; either version 2, or (at your option)
  16. ;; any later version.
  17.  
  18. ;; GNU Emacs is distributed in the hope that it will be useful,
  19. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21. ;; GNU General Public License for more details.
  22.  
  23. ;; You should have received a copy of the GNU General Public License
  24. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  25. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  26.  
  27. ;;; Commentary:
  28.  
  29. ;; This mode was written by Eric S. Raymond <esr@snark.thyrsus.com>,
  30. ;; inspired by an earlier asm-mode by Martin Neitzel.
  31.  
  32. ;; This minor mode is based on text mode.  It defines a private abbrev table
  33. ;; that can be used to save abbrevs for assembler mnemonics.  It binds just
  34. ;; five keys:
  35. ;;
  36. ;;    TAB        tab to next tab stop
  37. ;;    :        outdent preceding label, tab to tab stop
  38. ;;    ;        place or move comment
  39. ;;    C-j, C-m    newline and tab to tab stop
  40. ;;
  41. ;; Code is indented to the first tab stop level.
  42. ;; The ; key inserts copies of the value of asm-comment-char at an
  43. ;; appropriate spot.
  44.  
  45. ;; This mode runs two hooks:
  46. ;;   1) An asm-set-comment-hook before the part of the initialization
  47. ;; depending on asm-comment-char, and
  48. ;;   2) an asm-mode-hook at the end of initialization.
  49.  
  50. ;;; Code:
  51.  
  52. (defvar asm-comment-char ?;
  53.   "*The comment-start character assumed by Asm mode.")
  54.  
  55. (defvar asm-mode-syntax-table nil
  56.   "Syntax table used while in Asm mode.")
  57.  
  58. (defvar asm-mode-abbrev-table nil
  59.   "Abbrev table used while in Asm mode.")
  60. (define-abbrev-table 'asm-mode-abbrev-table ())
  61.  
  62. (defvar asm-mode-map nil
  63.   "Keymap for Asm mode.")
  64.  
  65. (if asm-mode-map
  66.     nil
  67.   (setq asm-mode-map (make-sparse-keymap))
  68.   (define-key asm-mode-map ";"        'asm-comment)
  69.   (define-key asm-mode-map ":"        'asm-colon)
  70.   (define-key asm-mode-map "\C-i"    'tab-to-tab-stop)
  71.   (define-key asm-mode-map "\C-j"    'asm-newline)
  72.   (define-key asm-mode-map "\C-m"    'asm-newline)
  73.   )
  74.  
  75. (defvar asm-code-level-empty-comment-pattern nil)
  76. (defvar asm-flush-left-empty-comment-pattern nil)
  77. (defvar asm-inline-empty-comment-pattern nil)
  78.  
  79. ;;;###autoload
  80. (defun asm-mode ()
  81.   "Major mode for editing typical assembler code.
  82. Features a private abbrev table and the following bindings:
  83.  
  84. \\[asm-colon]\toutdent a preceding label, tab to next tab stop.
  85. \\[tab-to-tab-stop]\ttab to next tab stop.
  86. \\[asm-newline]\tnewline, then tab to next tab stop.
  87. \\[asm-comment]\tsmart placement of assembler comments.
  88.  
  89. The character used for making comments is set by the variable
  90. `asm-comment-char' (which defaults to `?;').
  91.  
  92. Alternatively, you may set this variable in `asm-set-comment-hook', which is
  93. called near the beginning of mode initialization.
  94.  
  95. Turning on Asm mode runs the hook `asm-mode-hook' at the end of initialization.
  96.  
  97. Special commands:\\{asm-mode-map}
  98. "
  99.   (interactive)
  100.   (kill-all-local-variables)
  101.   (use-local-map asm-mode-map)
  102.   (setq mode-name "Assembler")
  103.   (setq major-mode 'asm-mode)
  104.   (setq local-abbrev-table asm-mode-abbrev-table)
  105.   (make-local-variable 'asm-mode-syntax-table)
  106.   (setq asm-mode-syntax-table (make-syntax-table))
  107.   (set-syntax-table asm-mode-syntax-table)
  108.   (run-hooks 'asm-mode-set-comment-hook)
  109.   (modify-syntax-entry    asm-comment-char
  110.             "<" asm-mode-syntax-table)
  111.   (modify-syntax-entry    ?\n
  112.              ">" asm-mode-syntax-table)
  113.   (let ((cs (regexp-quote (char-to-string asm-comment-char))))
  114.     (make-local-variable 'comment-start)
  115.     (setq comment-start (concat cs " "))
  116.     (make-local-variable 'comment-start-skip)
  117.     (setq comment-start-skip (concat cs "+[ \t]*"))
  118.     (setq asm-inline-empty-comment-pattern (concat "^.+" cs "+ *$"))
  119.     (setq asm-code-level-empty-comment-pattern (concat "^[\t ]+" cs cs " *$"))
  120.     (setq asm-flush-left-empty-comment-pattern (concat "^" cs cs cs " *$"))
  121.     )
  122.   (make-local-variable 'comment-end)
  123.   (setq comment-end "")
  124.   (make-local-variable 'comment-column)
  125.   (setq comment-column 32)
  126.   (auto-fill-mode 1)
  127.   (setq fill-prefix "\t")
  128.   (run-hooks 'asm-mode-hook)
  129.   )
  130.  
  131.  
  132. (defun asm-colon ()
  133.   "Insert a colon; if it follows a label, delete the label's indentation."
  134.   (interactive)
  135.   (save-excursion
  136.     (beginning-of-line)
  137.     (if (looking-at "[ \t]+\\(\\sw\\|\\s_\\)+$")
  138.     (delete-horizontal-space)))
  139.   (insert ":")
  140.   (tab-to-tab-stop)
  141.   )
  142.  
  143. (defun asm-newline ()
  144.   "Insert LFD + fill-prefix, to bring us back to code-indent level."
  145.   (interactive)
  146.   (if (eolp) (delete-horizontal-space))
  147.   (insert "\n")
  148.   (tab-to-tab-stop)
  149.   )
  150.  
  151. (defun asm-line-matches (pattern &optional withcomment)
  152.   (save-excursion
  153.     (beginning-of-line)
  154.     (looking-at pattern)))
  155.  
  156. (defun asm-pop-comment-level ()
  157.   ;; Delete an empty comment ending current line.  Then set up for a new one,
  158.   ;; on the current line if it was all comment, otherwise above it
  159.   (end-of-line)
  160.   (delete-horizontal-space)
  161.   (while (= (preceding-char) asm-comment-char)
  162.     (delete-backward-char 1))
  163.   (delete-horizontal-space)
  164.   (if (bolp)
  165.       nil
  166.     (beginning-of-line)
  167.     (open-line 1))
  168.   )
  169.  
  170.  
  171. (defun asm-comment ()
  172.   "Convert an empty comment to a `larger' kind, or start a new one.
  173. These are the known comment classes:
  174.  
  175.    1 -- comment to the right of the code (at the comment-column)
  176.    2 -- comment on its own line, indented like code
  177.    3 -- comment on its own line, beginning at the left-most column.
  178.  
  179. Suggested usage:  while writing your code, trigger asm-comment
  180. repeatedly until you are satisfied with the kind of comment."
  181.   (interactive)
  182.   (cond
  183.  
  184.    ;; Blank line?  Then start comment at code indent level.
  185.    ((asm-line-matches "^[ \t]*$")
  186.     (delete-horizontal-space)
  187.     (tab-to-tab-stop)
  188.     (insert asm-comment-char comment-start))
  189.  
  190.    ;; Nonblank line with no comment chars in it?
  191.    ;; Then start a comment at the current comment column
  192.    ((asm-line-matches (format "^[^%c]+$" asm-comment-char))
  193.     (indent-for-comment))
  194.  
  195.    ;; Flush-left comment present?  Just insert character.
  196.    ((asm-line-matches asm-flush-left-empty-comment-pattern)
  197.     (insert asm-comment-char))
  198.  
  199.    ;; Empty code-level comment already present?
  200.    ;; Then start flush-left comment, on line above if this one is nonempty. 
  201.    ((asm-line-matches asm-code-level-empty-comment-pattern)
  202.     (asm-pop-comment-level)
  203.     (insert asm-comment-char asm-comment-char comment-start))
  204.  
  205.    ;; Empty comment ends line?
  206.    ;; Then make code-level comment, on line above if this one is nonempty. 
  207.    ((asm-line-matches asm-inline-empty-comment-pattern)
  208.     (asm-pop-comment-level)
  209.     (tab-to-tab-stop)
  210.     (insert asm-comment-char comment-start))
  211.  
  212.    ;; If all else fails, insert character
  213.    (t
  214.     (insert asm-comment-char))
  215.  
  216.    )
  217.   (end-of-line))
  218.  
  219. ;;; asm-mode.el ends here
  220.